package travelDream.entities;

import java.io.Serializable;
import java.lang.String;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.xml.bind.DatatypeConverter;

import travelDream.dto.RegistrazioneDTO;

/**
 * Entity implementation class for Entity: Utente
 *
 */
@Entity
@Table(name="Utente")
@NamedQuery(name="user.findAll", query="SELECT g FROM Utente g")
public class Utente implements Serializable {
	   
	@Id
	private String email;
	@NotNull
	private String password;
	@NotNull
	private String nome;
	@NotNull
	private String cognome;
	@NotNull
	private String codiceFiscale;
	private static final long serialVersionUID = 1L;
	
	@ElementCollection(targetClass = Gruppo.class)
    @CollectionTable(name = "Utentegruppo",
                    joinColumns = @JoinColumn(name = "email"))
    @Enumerated(EnumType.STRING)
    @Column(name="nomeGruppo")
	private List<Gruppo> gruppi;
	
	@OneToMany(orphanRemoval=true)
    @JoinColumn(name="email_cliente")
	private List<Pagamento> pagamenti;
	
	@OneToMany(orphanRemoval=true)
    @JoinColumn(name="email_cliente")
	private List<PacchettoAcquistato> pacchetti_acquistati;
	
	public Utente() {
		super();
	}   
	
	public Utente(RegistrazioneDTO utente){
		try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            byte[] digest = messageDigest.digest(utente.getPassword().getBytes());
            this.password = DatatypeConverter.printHexBinary(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
		this.email=utente.getEmail();
		this.nome=utente.getNome();
		this.cognome=utente.getCognome();
		this.codiceFiscale=utente.getCodiceFiscale();
	}
	
	public Utente(Utente utente){
		this.password = utente.getPassword();
		this.email=utente.getEmail();
		this.nome=utente.getNome();
		this.cognome=utente.getCognome();
		this.codiceFiscale=utente.getCodiceFiscale();
		this.gruppi=utente.getGruppi();
		this.pagamenti=utente.getPagamenti();
		this.pacchetti_acquistati=utente.getPacchetti_acquistati();
	}
	
	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}   
	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
            byte[] digest = messageDigest.digest(password.getBytes());
            this.password = DatatypeConverter.printHexBinary(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
	}   
	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}   
	public String getCognome() {
		return this.cognome;
	}

	public void setCognome(String cognome) {
		this.cognome = cognome;
	}   
	public String getCodiceFiscale() {
		return this.codiceFiscale;
	}

	public void setCodiceFiscale(String codiceFiscale) {
		this.codiceFiscale = codiceFiscale;
	}

	public List<Gruppo> getGruppi() {
		return gruppi;
	}

	public void setGruppi(List<Gruppo> gruppi) {
		this.gruppi = gruppi;
	}

	public List<Pagamento> getPagamenti() {
		return pagamenti;
	}

	public void setPagamenti(List<Pagamento> pagamenti) {
		this.pagamenti = pagamenti;
	}

	public List<PacchettoAcquistato> getPacchetti_acquistati() {
		return pacchetti_acquistati;
	}

	public void setPacchetti_acquistati(
			List<PacchettoAcquistato> pacchetti_acquistati) {
		this.pacchetti_acquistati = pacchetti_acquistati;
	}   
	
	public void addPacchettoAcquistato(PacchettoAcquistato pa){
		this.pacchetti_acquistati.add(pa);
	}
   
}
